package com.example.mychatroom.component;

import org.springframework.stereotype.Component;
import org.springframework.web.socket.WebSocketSession;

import java.util.ConcurrentModificationException;
import java.util.HashMap;
import java.util.concurrent.ConcurrentHashMap;


@Component
public class OnlineUserManager {
    //此处要考虑线程安全问题
    private ConcurrentHashMap<String, WebSocketSession> webSocketSessionMap = new ConcurrentHashMap<String, WebSocketSession>();

    //用户上线，给这个哈希表插入键值对
    public void online(String userAccount,WebSocketSession session){
        //此处要考虑，两个不同的客户端，使用同一个账号登录（多开情况）
        //后一个客户端账号登录，就会把前一个客户端已经登录的状态剔除掉（保证同一时刻只能有一个客户端登录）
        //或者还有一种策略，就是说后者登录的时候显示登录失败
        //因此就要限制多开
        if (webSocketSessionMap.containsKey(userAccount)){
            //此时说明用户已经在线了，就登录失败，不会记录这个映射关系
            //一旦不记录这个映射关系，后续也就收不到任何消息
            return;
        }else {
            webSocketSessionMap.put(userAccount, session);
            System.out.println("[" + userAccount + "] 上线！" );
        }
    }

    //用户下线，给这个哈希表删除键值对
    public void logOut(String userAccount,WebSocketSession session){
        WebSocketSession existSession = webSocketSessionMap.get(userAccount);
        //TODO:此处采用equals还是==？有待验证
        if (existSession == session){
            //如果这两个是同一个Session，才真正进行下限操作，否则就啥也不干
            webSocketSessionMap.remove(userAccount);
            System.out.println("[" + userAccount + "] 下线！" );
        }
    }

    //根据useAccount获取到WebSocketSession
    public WebSocketSession getWebSocketSession(String userAccount){
        return webSocketSessionMap.get(userAccount);
    }
}
